<?php
/* 
 * POP3からメイルを受信するオブジェクト
 * 
 * author	；t.odaka
 * date		;2009/5/16
 * 
 * modified;
 * 
*/

require_once("Net/POP3.php");
require_once('Mail/mimeDecode.php');

require_once('../Myznala/Config.php');

class ReceiveMailBean {
	/* プロパティー */
	var $_Pop3host, $_Pop3port, $_Pop3user, $_Pop3pass; 
	
	/* デフォルトのコンストラクタ */
	function __construct() {
		
		require("../Myznala/debugLog.php");
		// debugログの出力
//		$myDebugLog->debug("constructor: start");
		$this->setPop3Host();
		$this->setPop3Port();
		$this->setPop3User();
		$this->setPop3Pass();
		$this->setPop3DeleteAfter();
		// debugログの出力
//		$myDebugLog->debug("constructor: end");
	}

	/* setter */
	function setPop3Host(){
		$this->_Pop3host=POP3HOST;
	}
	function setPop3Port(){
		$this->_Pop3port=POP3PORT;
	}
	function setPop3User(){
		$this->_Pop3user=POP3USER;
	}
	function setPop3Pass(){
		$this->_Pop3pass=POP3PASS;
	}
	function setPop3DeleteAfter(){
		$this->_Pop3DeleteAfter=POP3DELETEAFTER;
	}
	
	function mailreceive(){
		require("../Myznala/debugLog.php");
		
		// debguログの出力
//		$myDebugLog->debug("mailreceive: start");

		/*
		 * 変数定義
		 */
		$host=$this->_Pop3host;
    	$port=$this->_Pop3port;
    	$user=$this->_Pop3user;
		$pass=$this->_Pop3pass;
		
//		$myDebugLog->debug("host: ".$host);
//		$myDebugLog->debug("port: ".$port);
//		$myDebugLog->debug("user: ".$user);
//		$myDebugLog->debug("pass: ".$pass);
		
    	/*
    	 * ログイン
    	 */
		$pop3 = new Net_POP3();
		$ret = $pop3->connect($host, $port);

		// 接続OKのとき
		if ($ret) {
//			$myDebugLog->debug("connected to ".$host);
			
			$ret = $pop3->login($user, $pass, true);
			// ログインOKのとき
		    if ($ret) {
//				$myDebugLog->debug("logged in to ".$host);
			
		        $cnt = $pop3->numMsg();
//				$myDebugLog->debug("num of messages ".$num);

				for ($i=1; $i <= $cnt; $i++) {
					$msg = array();  
					$attach = array();
				
					//メールをMail_mimeDecodeでパースする  
					$dObj = new Mail_mimeDecode($pop3->getMsg($i));
					
					$params['include_bodies'] = true; //ボディを解析する  
					$params['decode_bodies'] = true; //ボディのデコードをする   
					$params['decode_headers'] = true; //ヘッダーのデコードをする  
					// パース
					$parsedMessages = $dObj->decode($params);  
//					$myDebugLog->debug($parsedMessages); // これで構造が全部分かるよ！！
				
					/*
					 * ヘッダーの処理
					 */
					//送信者のメールアドレスを抽出  
					$from = $parsedMessages->headers['from'];  
//					$myDebugLog->debug('$from: '.$from);
					
					//署名付きのアドレスの場合、そちらを優先する。  
					preg_match("/<.*>/", $from, $str);  
					if ($str[0]!="") {  
						$str = substr($str[0], 1, strlen($str[0])-2);  
						$from = $str;  
					}  
//					$myDebugLog->debug('$from: '.$from);
					$msg['from'] = $from;
					
					// 受信時間を取得 
					if($parsedMessages->headers['date'] == null){
					// 普通にdateヘッダーがない場合（$parsedMessagesをダンプして対応してください）。
					// 以下、XMailServerの場合
//						$myDebugLog->debug('$date: '.$parsedMessages->headers['received']);
						$wk = split(";",$parsedMessages->headers['received']);
//						$myDebugLog->debug('orgTime: '.$wk[1]);
						$date = date("Y-m-d H:i:s", strtotime($wk[1]));
						$msg['date'] = $date;	
					}else{
					// 普通にdateヘッダーがある場合。
					// 以下、BlackJumboDogの場合
//						$myDebugLog->debug('$date: '.$parsedMessages->headers['date']);
						$date = date("Y-m-d H:i:s", strtotime($parsedMessages->headers['date']));
						$msg['date'] = $date;					
					}
					
					// 件名を取得  
					$subject = $parsedMessages->headers['subject'];  
					$subject = mb_convert_encoding($subject, "UTF-8", "jis");  
//					$myDebugLog->debug('$subject: '.$subject);
					$msg['subject'] = $subject;
					
					/*
					 * パート（本文、添付）の処理
					 */
					switch(strtolower($parsedMessages->ctype_primary)){  
  
						// シングルパート(本文のみ)
						case "text":
							$body = $parsedMessages->body;  
							$body = mb_convert_encoding($body, "UTF-8", "jis");  
//							$myDebugLog->debug('Single Part Message');
//							$myDebugLog->debug('$body: '.$body);
							$msg['body'] = $subject;
							// attachmentはnull.
							$msg['attachment'] = null;
							break;  
  
						// マルチパート
						// 各パートを１つのメイルとして処理する。  
						case "multipart":
//							$myDebugLog->debug('Multi Part Message');
							foreach($parsedMessages->parts as $part){
							
								switch(strtolower($part->ctype_primary)){  
  
								// 本文  
								case 'text':
									$body = $part->body;  
									$body = mb_convert_encoding($body, "UTF-8", "jis");  
//									$myDebugLog->debug('Contents');
//									$myDebugLog->debug('$body: '.$body);
									$msg['body'] = $body;
									break;
  
								// バイナリー(application file)
								case 'application':
									//添付ファイル
									foreach($part->ctype_parameters as $key => $value ){
										//ISO-2022-JPの場合
										if($key == 'name'){
											$fName = mb_convert_encoding($value, "UTF-8", "jis"); 
										}else{
											//US-ASCIIの場合
//												$myDebugLog->debug('$value: '.$value);
												$ret = preg_replace('/^(US-ASCII\'\')+?/', '', $value);
//												$myDebugLog->debug('$ret: '.$ret);
												//長い日本語名称の場合の対応
												$ret1 = preg_replace('/(\"\s(name)\*\d\*=\")+/','',$ret);
//												$myDebugLog->debug('$ret1: '.$ret1);
												$fName = urldecode($ret1);
										}
									}
										
									//ファイル名がsjisであると過程して、UTF-8から変換（復元）する。
									$sjisfName = mb_convert_encoding($fName, "Shift-JIS", "UTF-8"); 
										
//									$myDebugLog->debug('$sjisfName: '.$sjisfName);
								
									// 画面用配列
									$n = count($attach);
									$attach[$n] = array($fName,urlencode($fName)); // 画面表示用なのでUTF-8のものを格納
																	
									// 添付ファイル(body部)を書き出す（ファイル名はOSのエンコーディングにあわせる）。
//									$osfName = mb_convert_encoding($sjisfName,OS_ENCODING,"Shift-JIS");
//									$myDebugLog->debug('$osfName: '.$osfName);
									// URL Encodeしたファイル名で保存
									$fp = fopen('../tmp/'.urlencode($fName), "w");
//									$fp = fopen('../tmp/'.$osfName, "w");  
									//$fp = fopen('../tmp/'.$fName, "w");  
									$length = strlen($part->body);
									fwrite($fp, $part->body, $length);  
									fclose($fp);
									break;  
  
								// バイナリー(image file)
								case "image":
									foreach($part->ctype_parameters as $key => $value ){
										//ファイル名が、US-ASCIIの場合
										preg_match('/^(US-ASCII\'\')+?/',$value,$match);
										if($match[0].length > 0){
//												$myDebugLog->debug('$value: '.$value);
												$ret = preg_replace('/^(US-ASCII\'\')+?/', '', $value);
//												$myDebugLog->debug('$ret: '.$ret);
												//長い日本語名称の場合の対応
												$ret1 = preg_replace('/(\"\s(name)\*\d\*=\")+/','',$ret);
//												$myDebugLog->debug('$ret1: '.$ret1);
												$fName = urldecode($ret1);
																														
										}else{
											//ISO-2022-JPの場合
											if($key == 'name'){
												$fName = mb_convert_encoding($value, "UTF-8", "jis"); 
											}
										} 
									}
										
									//ファイル名がsjisであると過程して、UTF-8から変換（復元）する。
									$sjisfName = mb_convert_encoding($fName, "Shift-JIS", "UTF-8"); 
//									$myDebugLog->debug('$sjisfName: '.$sjisfName);
								
									// attachmentはファイル名を配列にいれていく。
									$n = count($attach);
									$attach[$n] = array($fName,urlencode($fName)); // 画面表示用なのでUTF-8のものを格納
																	
									// 添付ファイル(body部)を書き出す（ファイル名はOSのエンコーディングにあわせる）。
//									$osfName = mb_convert_encoding($sjisfName,OS_ENCODING,"Shift-JIS");
//									$myDebugLog->debug('$osfName: '.$osfName);
//									if(strtolower(OS_ENCODING) == 'shift_jis'){
									// URL Encodeした名前で保存
									$fp = fopen('../tmp/'.urlencode($fName), "w");
//										$fp = fopen('../tmp/'.$osfName, "w");
//									}else{
//										$fp = fopen('../tmp/'.$fName, "w");
//									}  
									$length = strlen($part->body);
									fwrite($fp, $part->body, $length);  
									fclose($fp);
									break;  

								default:
								
								}
							} // partのloopの終了
							
							$msg['attachment'] = $attach;
							
							break;
						
						// シングルパートとマルチパート以外。（基本的にはない）
						default:
						$body = "";  
					}
					$result[$i]=$msg;
			}
			
			// 取得した結果（$result）を日付降順でソート
			if(count($result)>0){
				$darray = array();
				foreach($result as $v) array_push($darray,$v['date']); //sort用配列
				array_multisort($darray, SORT_DESC, SORT_STRING, $result);
			}
			
			// メッセージの削除
       		if($this->_Pop3DeleteAfter){
				$pop3->deleteMsg($i);
       		}
               		
   	 		} else {
        		return false;
    		}
		} else {
        	return false;
	}
	// 切断
	$pop3->disconnect();
	
	return $result;
	}
}
?>